package com.operator.Activitys.jpush;

/**
 * 项目名称：ODD
 * 类描述：极光推送 广播接收者
 * 创建人：张飞祥
 * 创建时间：2017/11/23 14:42
 * 修改人：张飞祥
 * 修改时间：2017/11/23 14:42
 * 修改备注：
 */

import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.view.WindowManager;

import com.afollestad.materialdialogs.MaterialDialog;
import com.google.gson.Gson;
import com.operator.Activitys.R;
import com.operator.Activitys.activity.MsgNoticeActivity;
import com.operator.Activitys.activity.MyOrderActivity;
import com.operator.Activitys.activity.PrizePunishListActivity;
import com.operator.Activitys.activity.PutForwardListActivity;
import com.operator.Activitys.activity.SupplyActivity;
import com.operator.Activitys.activity.TradeListActivity;
import com.operator.Activitys.bean.JPush;
import com.operator.Activitys.bean.TransferList;
import com.operator.Activitys.bean.User;
import com.operator.Activitys.utils.ACache;
import com.operator.Activitys.utils.Constant;
import com.operator.Activitys.utils.LogUtils;

import org.simple.eventbus.EventBus;

import cn.jpush.android.api.JPushInterface;

import static android.content.Context.NOTIFICATION_SERVICE;

public class MyReceiver extends BroadcastReceiver {

    //log tag
    private static final String TAG = "JPush";
    //自定义消息接收的 json字符串
    private String pushJson;
    //自定义消息接收的 tag 字符串
    private String pushTag;
    //自定义消息接收的 标题 字符串
    private String pushTitle;
    //缓存管理
    private ACache mACache;
    //内存中的 用户
    private User mUser;
    //activity 跳转纽带
    private Intent mIntent;
    //极光推送消息 实体
    private JPush mJPush;

    //TODO  dialog
    //Builder
    private MaterialDialog.Builder mBuilder = null;
    //Dialog
    private MaterialDialog mDialog = null;

    //TODO 创建 Gson 解析 接收的消息 json
    Gson gson = new Gson();

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        //TODO 实例化参数配置
        mACache = ACache.get(context);

        if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
            /**
             * 接收 自定义 消息
             * EXTRA_MESSAGE：json 字符串
             * EXTRA_CONTENT_TYPE：通知类型
             * EXTRA_TITLE：通知标题
             */
            //json
            pushJson =  bundle.getString(JPushInterface.EXTRA_MESSAGE);
            //tag
            pushTag =  bundle.getString(JPushInterface.EXTRA_CONTENT_TYPE);
            //title
            pushTitle =  bundle.getString(JPushInterface.EXTRA_TITLE);

            LogUtils.e("pushJson:--------->"+pushJson);
            LogUtils.e("pushTag:--------->"+pushTag);
            LogUtils.e("pushTitle:--------->"+pushTitle);

            /**
             * 消息 判断
             */
            switch (pushTag){

                //TODO 店铺认证结果
                case "1":
                    setShowShopConfirm(context,pushTitle);
                    break;
                //TODO 转账
                case "2":
                    //获取 数据实体
                    TransferList transfer = gson.fromJson(pushJson + "", TransferList.class);
                    //跳转参数
                    mIntent = new Intent (context,TradeListActivity.class);
                    //弹出转账 通知
                    onShowReceive(context,mIntent,pushTitle,
                            "收到了一笔来自 “"+transfer.getFromStoreName()+"” 店铺 "+transfer.getMoney()+" 元的转账 [点击查看]");

                    //TODO 获取内存 最新的 用户实体
                    mUser = new Gson().fromJson(mACache.getAsJSONObject(Constant.CACHE_USER) + "", User.class);
                    //保存新的 用户余额参数
                    mUser.setRemainder(transfer.getCurentRemainder());
                    mACache.put(Constant.CACHE_USER, new Gson().toJson(mUser));

                    //发送更新余额 消息
                    EventBus.getDefault().post(transfer.getCurentRemainder(), Constant.BUS_MY_REMAINDER);
                    break;
                //TODO 号卡 获取验证码
                case "3":
                    //跳转参数
                    mIntent = new Intent (context,MsgNoticeActivity.class);
                    //弹出 验证码 通知
                    onShowReceive(context,mIntent,"验证码："+pushTitle,
                            "来自金泽云卡号的验证码！【吉林省宝利信息技术有限公司】");
                    break;
                //TODO 通讯供求
                case "4":
                    //跳转参数
                    mIntent = new Intent (context,SupplyActivity.class);
                    //弹出 验证码 通知
                    onShowReceive(context, mIntent,"您收到了新的一条供求信息",pushTitle+" [点击查看]");
                    break;
                //TODO 奖惩推送
                case "5":
                    //跳转参数
                    mIntent = new Intent (context,PrizePunishListActivity.class);
                    //弹出 验证码 通知
                    onShowReceive(context, mIntent,pushTitle,"您收到了新的一条奖惩信息！[点击查看]");

                    //TODO 获取 通知实体对象
                    //获取 数据实体
                    mJPush = gson.fromJson(pushJson + "", JPush.class);

                    //TODO 获取内存 最新的 用户实体
                    mUser = new Gson().fromJson(mACache.getAsJSONObject(Constant.CACHE_USER) + "", User.class);
                    //保存新的 用户余额参数
                    mUser.setRemainder(mJPush.getRemainder());
                    mACache.put(Constant.CACHE_USER, new Gson().toJson(mUser));

                    //发送更新余额 消息
                    EventBus.getDefault().post(mJPush.getRemainder(), Constant.BUS_MY_REMAINDER);
                    break;
                //TODO 开卡完成
                case "6":
                    //跳转参数
                    mIntent = new Intent (context,MyOrderActivity.class);
                    //弹出 验证码 通知
                    onShowReceive(context, mIntent,"开卡成功",pushTitle+" [点击查看]");
                    break;
                //TODO 宽带审核通过
                case "7":
                    //跳转参数
                    mIntent = new Intent (context,MyOrderActivity.class);
                    mIntent.putExtra(Constant.INTENT_MY_ORDER_TAG,1);
                    //弹出 验证码 通知
                    onShowReceive(context, mIntent,"宽带订单审核通过",pushTitle+" [点击查看]");
                    break;

                //TODO 开卡失败，退款通知
                case "8":
                    //跳转参数
                    mIntent = new Intent (context,MyOrderActivity.class);
                    //弹出 验证码 通知
                    onShowReceive(context, mIntent,"开卡失败",pushTitle+" [点击查看]");
                    //TODO 获取 通知实体对象
                    //获取 数据实体
                    mJPush = gson.fromJson(pushJson + "", JPush.class);

                    //TODO 获取内存 最新的 用户实体
                    mUser = new Gson().fromJson(mACache.getAsJSONObject(Constant.CACHE_USER) + "", User.class);
                    //保存新的 用户余额参数
                    mUser.setRemainder(mJPush.getRemainder());
                    mACache.put(Constant.CACHE_USER, new Gson().toJson(mUser));

                    //发送更新余额 消息
                    EventBus.getDefault().post(mJPush.getRemainder(), Constant.BUS_MY_REMAINDER);
                    break;

                //TODO 宽带订单审核失败 通知
                case "9":
                    //跳转参数 | 跳转到 宽带页面
                    mIntent = new Intent (context,MyOrderActivity.class);
                    mIntent.putExtra(Constant.INTENT_MY_ORDER_TAG,1);
                    //弹出 验证码 通知
                    onShowReceive(context, mIntent,"宽带订单审核失败",pushTitle+" [点击查看]");
                    //TODO 获取 通知实体对象
                    //获取 数据实体
                    mJPush = gson.fromJson(pushJson + "", JPush.class);

                    //TODO 获取内存 最新的 用户实体
                    mUser = new Gson().fromJson(mACache.getAsJSONObject(Constant.CACHE_USER) + "", User.class);
                    //保存新的 用户余额参数
                    mUser.setRemainder(mJPush.getRemainder());
                    mACache.put(Constant.CACHE_USER, new Gson().toJson(mUser));

                    //发送更新余额 消息
                    EventBus.getDefault().post(mJPush.getRemainder(), Constant.BUS_MY_REMAINDER);
                    break;

                //TODO 提现到账推送 通知
                case "10":
                    //跳转参数
                    mIntent = new Intent (context,PutForwardListActivity.class);
                    //弹出 验证码 通知
                    onShowReceive(context, mIntent,"提现通知",pushTitle+" [点击查看]");
                    break;

                //TODO 店铺解冻 通知
                case "11":
                    //解冻操作
                    setShowFrozen(context,Constant.SHOP_STATE_YES,"店铺解冻通知",
                            context.getResources().getString(R.string.shop_frozen_no),
                            Color.parseColor("#699aff"));
                    break;

                //TODO 店铺冻结 通知
                case "12":
                    //冻结操作
                    setShowFrozen(context,Constant.SHOP_STATE_NO,"店铺冻结通知",
                            context.getResources().getString(R.string.shop_frozen_yes),
                            Color.parseColor("#EC5B5B"));
                    break;

                //TODO 自定义推送（根据ID）
                case "13":
                    //跳转参数
                    mIntent = new Intent (context,MsgNoticeActivity.class);
                    //获取 数据实体
                    mJPush = gson.fromJson(pushJson + "", JPush.class);
                    //弹出 自定义消息通知
                    onShowReceive(context, mIntent,pushTitle,mJPush.getContent());
                    break;

                //TODO 自定义推送（整体）
                case "14":
                    //跳转参数
                    mIntent = new Intent (context,MsgNoticeActivity.class);
                    //获取 数据实体
                    mJPush = gson.fromJson(pushJson + "", JPush.class);
                    //弹出 自定义消息通知
                    onShowReceive(context, mIntent,pushTitle,mJPush.getContent());
                    break;

                //TODO 号卡返现推送
                case "15":
                    //跳转参数
                    mIntent = new Intent (context,MsgNoticeActivity.class);
                    //获取 数据实体
                    mJPush = gson.fromJson(pushJson + "", JPush.class);

                    //TODO 获取内存 最新的 用户实体
                    mUser = new Gson().fromJson(mACache.getAsJSONObject(Constant.CACHE_USER) + "", User.class);
                    //保存新的 用户余额参数
                    mUser.setRemainder(mJPush.getRemainder());
                    mACache.put(Constant.CACHE_USER, new Gson().toJson(mUser));
                    //发送更新余额 消息
                    EventBus.getDefault().post(mJPush.getRemainder(), Constant.BUS_MY_REMAINDER);

                    //弹出 自定义消息通知
                    onShowReceive(context, mIntent,"号卡返现",pushTitle+" [点击查看]");
                    break;

                //TODO 宽带返现推送
                case "16":
                    //跳转参数
                    mIntent = new Intent (context,MsgNoticeActivity.class);
                    //获取 数据实体
                    mJPush = gson.fromJson(pushJson + "", JPush.class);

                    //TODO 获取内存 最新的 用户实体
                    mUser = new Gson().fromJson(mACache.getAsJSONObject(Constant.CACHE_USER) + "", User.class);
                    //保存新的 用户余额参数
                    mUser.setRemainder(mJPush.getRemainder());
                    mACache.put(Constant.CACHE_USER, new Gson().toJson(mUser));
                    //发送更新余额 消息
                    EventBus.getDefault().post(mJPush.getRemainder(), Constant.BUS_MY_REMAINDER);

                    //弹出 自定义消息通知
                    onShowReceive(context, mIntent,"宽带返现",pushTitle+" [点击查看]");
                    break;
            }

        }else if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
            /**
             * 接收 Registration Id
             */
            String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
            Log.e(TAG, "[MyReceiver] 接收Registration Id : " + regId);
        } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
            /**
             * 接收 推送下来的通知
             */
            Log.e(TAG, "[MyReceiver] 接收到推送下来的通知");
            int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
            Log.e(TAG, "[MyReceiver] 接收到推送下来的通知的ID: " + notifactionId);
        } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
            /**
             * 点击 推送下来的通知
             */
            Log.e(TAG, "[MyReceiver] 用户点击打开了通知");
        } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
            //在这里根据 JPushInterface.EXTRA_EXTRA 的内容处理代码，比如打开新的Activity， 打开一个网页等..
            Log.e(TAG, "[MyReceiver] 用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
        } else if(JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) {
            boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false);
            Log.e(TAG, "[MyReceiver]" + intent.getAction() +" connected state change to "+connected);
        } else {
            Log.e(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction());
        }
    }

    // 打印所有的 intent extra 数据
    private static String printBundle(Bundle bundle) {

        return null;
    }

    /**
     * 店铺 认证审核结果
     */
    public void setShowShopConfirm(Context context,String state) {

        //更新内存中的用户信息
        //TODO 获取内存 最新的 用户实体
        mUser = gson.fromJson(mACache.getAsJSONObject(Constant.CACHE_USER) + "", User.class);
        //保存认证 结果参数
        mUser.setIsCertified(pushTag);
        mACache.put(Constant.CACHE_USER, new Gson().toJson(mUser));

        //发送极光店铺认证 通过 | 失败 通知
        EventBus.getDefault().post(state,Constant.BUS_JPUSH_SHOP_CONFIRM_TAG);

        //TODO 店铺认证是否通过 显示弹窗
        //未通过
        if (state.equals(Constant.SHOP_CONFIRM_NO)){
            //显示弹窗
            initShowMsgDialog(context,"店铺认证失败！",
                    context.getResources().getString(R.string.shop_confirm_fail_content),
                    Color.parseColor("#EC5B5B"));
            //已通过
        }else if (state.equals(Constant.SHOP_CONFIRM_YES)){
            //显示弹窗
            initShowMsgDialog(context,"店铺认证成功！",
                    context.getResources().getString(R.string.shop_confirm_success_content),
                    Color.parseColor("#699aff"));
        }
    }

    /**
     * 冻结 | 解冻 操作
     */
    public void setShowFrozen(Context context,String state,String title,String content,int color) {

        //更新内存中的用户信息
        //TODO 获取内存 最新的 用户实体
        mUser = gson.fromJson(mACache.getAsJSONObject(Constant.CACHE_USER) + "", User.class);
        //保存店铺 冻结 参数
        mUser.setState(state);
        mACache.put(Constant.CACHE_USER, new Gson().toJson(mUser));

        //发送 极光 冻结 | 解冻 通知
        EventBus.getDefault().post(state,Constant.BUS_JPUSH_SHOP_FROZEN_TAG);

        //TODO 显示弹窗
        initShowMsgDialog(context,title,content, color);
    }

    /**
     * 显示 提示 dialog
     */
    public void initShowMsgDialog(Context context,String title,String content,int color){
        //提示 dialog
        mBuilder = new MaterialDialog.Builder(context)
                .title(title)
                .titleColor(color)
                .content(content)
                .positiveText("好，我知道了")
                .positiveColor(color);
        //配置 dialog 参数
        mDialog = mBuilder.build();
        //全局弹窗 显示
        mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        //显示弹窗
        mDialog.show();
        // 设置点击屏幕Dialog不消失
        mDialog.setCanceledOnTouchOutside(false);
        //取消Back键监听
        mDialog.setCancelable(false);
    }

    /**
     * 自定义广播 接收 弹出
     * @param context
     * @param intent
     */

    public void onShowReceive(Context context, Intent intent, String pushTitle, String pushContent) {

        //设置获取哪个服务
        final NotificationManager manager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);

        //TODO 兼容 8.0 写法
        final String id = "1";
        String name = "channel_name";

        /**
         * 版本判断
         */
        NotificationCompat.Builder builder ;

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(id, name,NotificationManager.IMPORTANCE_HIGH);
            manager.createNotificationChannel(channel);
            builder = new NotificationCompat.Builder(context, id);
        }else {
            builder = new NotificationCompat.Builder(context);
        }

        //判断 是否需要跳转事件
        if (intent != null){
            PendingIntent pi = PendingIntent.getActivities(context, 0, new Intent[]{intent}, PendingIntent.FLAG_UPDATE_CURRENT);
            builder.setContentIntent(pi);
            builder.setTicker("消息");
            builder.setPriority(Notification.PRIORITY_HIGH);
        }

        //TODO 配置参数
        builder .setSmallIcon(R.mipmap.ic_launcher)                 //设置图标
                .setContentTitle(pushTitle)                         //设置标题
                .setContentText(pushContent)                        //消息内容
                .setAutoCancel(true)                                //点击后消失
                .setDefaults(NotificationCompat.DEFAULT_ALL);       //使用所有默认值，比如声音，震动，闪屏等等

        //获取配置的参数
        Notification notification = builder.build();
        //启动 弹窗
        manager.notify(1,notification);
    }
}
